﻿#region << 版 本 注 释 >>
/*----------------------------------------------------------------
 * 版权所有 (c) 2023  NJRN 保留所有权利。
 * CLR版本：4.0.30319.42000
 * 机器名称：DESKTOP-4P8G8RH
 * 公司名称：
 * 命名空间：HuanTian.WebCore.Filter
 * 唯一标识：7f0fbe36-3390-4781-907f-989f63ef0514
 * 文件名：testclass
 * 当前用户域：DESKTOP-4P8G8RH
 * 
 * 创建者：wanglei
 * 电子邮箱：271976304@qq.com
 * 创建时间：2023/4/18 20:42:38
 * 版本：V1.0.0
 * 描述：
 *
 * ----------------------------------------------------------------
 * 修改人：
 * 时间：
 * 修改说明：
 *
 * 版本：V1.0.1
 *----------------------------------------------------------------*/
#endregion << 版 本 注 释 >>
using Microsoft.AspNetCore.Mvc.Filters;

namespace HuanTian.WebCore
{
    /// <summary>
    /// 操作过滤器
    /// </summary>
    public class AsyncActionFilter : IAsyncActionFilter
    {
        /// <summary>
        /// 执行方法
        /// </summary>
        /// <param name="context"></param>
        /// <param name="next"></param>
        /// <returns></returns>
        /// <exception cref="ArgumentException"></exception>
        public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
        {
            //// 获取请求所带的参数
            //var parameters = context.ActionArguments;

            //// 处理JSON请求体参数
            //if (context.HttpContext.Request.ContentType?.Contains("application/json") == true)
            //{
            //    context.HttpContext.Request.EnableBuffering();
            //    context.HttpContext.Request.Body.Position = 0;
            //    using (var reader = new StreamReader(
            //        context.HttpContext.Request.Body,
            //        encoding: Encoding.UTF8,
            //        detectEncodingFromByteOrderMarks: false,
            //        bufferSize: 1024,
            //        leaveOpen: true))
            //    {
            //        var body = await reader.ReadToEndAsync();
            //        if (!string.IsNullOrEmpty(body))
            //        {
            //            try
            //            {
            //                var jsonParams = System.Text.Json.JsonSerializer.Deserialize<Dictionary<string, object>>(body);
            //                foreach (var item in jsonParams)
            //                {
            //                    if (!parameters.ContainsKey(item.Key))
            //                    {
            //                        parameters[item.Key] = item.Value;
            //                    }
            //                }
            //            }
            //            catch { /* 忽略JSON解析错误 */ }
            //        }
            //    }
            //    context.HttpContext.Request.Body.Position = 0;
            //}

            // 检查ModelState是否有错误
            if (!context.ModelState.IsValid)
            {
                var errors = context.ModelState
                    .Where(x => x.Value.Errors.Count > 0)
                    .SelectMany(x => x.Value.Errors.Select(e => $"{x.Key}: {e.ErrorMessage}"))
                    .ToList();

                throw new ArgumentException(string.Join(Environment.NewLine, errors) + "- filter");
            }

            // 调用下一个中间件或过滤器
            var result = await next();
        }
    }
}
